package com.fanghaoran.notes.dao;

import com.fanghaoran.notes.bean.CountByName;
import com.fanghaoran.notes.bean.CountByTid;
import com.fanghaoran.notes.bean.DiscountDetail;
import com.fanghaoran.notes.bean.DiscountUsageDetail;
import com.fanghaoran.notes.entity.*;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @Author: win11
 * @Date: 2023/04/18/22:25
 * @Description: 商品dao层
 */
public interface ProductDao {
    /**
     * 获取特定商品类型的商品个数
     * @param tId 类型Id
     * @return 返回个数
     * @throws Exception 异常
     */
    CountByTid selectTotalCountByTid(int tId) throws Exception;

    /**
     * 获取特定商品类型指定页码且按照订单数排序的商品
     * @param page 页码
     * @param pageSize 每页个数
     * @param tId 类型id
     * @return 返回商品
     * @throws Exception 异常
     */
    List<Product> selectProductByTidOrderBySales(int page, int pageSize, int tId) throws Exception;


    /**
     * 获取特定商品类型指定页码且按照评分排序的商品
     * @param page 页码
     * @param pageSize 每页个数
     * @param tId 类型id
     * @return 返回商品
     * @throws Exception 异常
     */
    List<Product> selectProductByTidOrderByScore(int page, int pageSize, int tId) throws Exception;

    /**
     * 通过搜索获取相关商品的商品个数
     * @param name 搜索词
     * @return 返回个数
     * @throws Exception 异常
     */
    CountByName selectTotalCountByName(String name) throws Exception;

    /**
     * 获取与搜索词相关的商品 指定页码 根据订单数排序的商品
     * @param page 页码
     * @param pageSize 每页个数
     * @param name 搜索词
     * @return 返回商品
     * @throws Exception 异常
     */
    List<Product> selectProductByNameOrderBySales(int page, int pageSize, String name) throws Exception;


    /**
     * 获取与搜索词相关的商品 指定页码 根据评分排序的商品
     * @param page 页码
     * @param pageSize 每页个数
     * @param name 搜索词
     * @return 返回商品
     * @throws Exception 异常
     */
    List<Product> selectProductByNameOrderByScore(int page, int pageSize, String name) throws Exception;


    /**
     * 通过商品id搜索商品
     * @param pId 商品id
     * @return 返回商品
     * @throws Exception 异常
     */
    List<Product> selectProductByPid(int pId) throws Exception;

    /**
     * 加入某个用户的收藏表
     * @param uId 用户id
     * @param pId 商品id
     * @param isFavorite 收藏的标志数1
     * @return 返回插入是否成功
     * @throws SQLException 异常
     */
    Integer insertFavorite(int uId,int pId, int isFavorite) throws SQLException;

    /**
     * 获取某个用户某个商品的收藏数据(用来判断该商品是否被收藏)
     * @param uId 用户id
     * @param pId 商品id
     * @return 返回收藏数据
     * @throws Exception 异常
     */
    List<Favorite> selectFavoriteByUidAndPid(Integer uId, int pId) throws Exception;

    /**
     * 插入商品
     * @param uId 商家id
     * @param productName 商品名称
     * @param price 商品价格
     * @param stock 商品库存
     * @param productInfo 商品介绍
     * @param type 商品类型
     * @param productFile 商品图片
     * @return 返回插入结果
     * @throws SQLException 异常
     */
    Integer insertProduct(int uId,String productName, BigDecimal price, int stock, String productInfo, int type, String productFile) throws SQLException;

    /**
     * 搜索某个商家的商品数据
     * @param uId 商家id
     * @return 返回商品信息
     * @throws Exception 异常
     */
    List<Product> selectProductByUid(Integer uId) throws Exception;

    /**
     * 更新商品信息
     * @param pId 商品id
     * @param pName 商品名称
     * @param price 商品价格
     * @param stock 商品库存
     * @param pInfo 商品信息
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateProduct(int pId, String pName, BigDecimal price, int stock, String pInfo) throws SQLException;

    /**
     * 获取商品的销量排名
     * @return 返回商品信息
     * @throws Exception 异常
     */
    List<Product> selectProductRank() throws Exception;

    /**
     * 购买后更新商品的库存和销量
     * @param pid 商品id
     * @param sales 销量
     * @param stock 库存
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateProductAfterBuy(int pid,int sales, int stock) throws SQLException;

    /**
     * 添加优惠券
     * @param pId 商品id
     * @param type 商品类型
     * @param amount 优惠券数量
     * @return 返回插入结果
     * @throws SQLException 异常
     */
    Integer addDiscount(int pId, int type, int amount) throws SQLException;

    /**
     * 查询某个商品的优惠券情况
     * @param pId 商品Id
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<DiscountDetail> selectDiscountByPid(int pId) throws Exception;

    /**
     * 查询某个用户某个商品的优惠券使用情况
     * @param pId 商品id
     * @param uId 用户id
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<DiscountUsage> selectUsageOfDiscount(int pId, int uId) throws Exception;

    /**
     * 插入某个用户某个商品的优惠券使用情况
     * @param pId 商品id
     * @param uId 用户id
     * @param tId 优惠券类型id
     * @param dAmount 数量
     * @param dState 优惠券使用状态
     * @return 返回插入结果
     * @throws SQLException 异常
     */
    Integer insertUsageOfDiscount(int pId, int uId, int tId, int dAmount, int dState) throws SQLException;

    /**
     * 查询某个商品某种类型优惠券的数据
     * @param pId 商品id
     * @param tId 类型id
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<Discount> selectDiscountByPidAndTid(int pId, int tId) throws Exception;

    /**
     * 更新优惠券的数量
     * @param pId 商品id
     * @param tId 类型id
     * @param after 更新后的数量
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateDiscount(int pId, int tId, int after) throws SQLException;

    /**
     * 查询某个用户某个商品优惠券的使用情况
     * @param pId 商品id
     * @param uId 用户id
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<DiscountUsageDetail> selectDiscountUsageDetail(int pId, int uId) throws Exception;

    /**
     * 更新某个用户某个商品优惠券的使用情况
     * @param pId 商品id
     * @param uId 用户id
     * @param state 状态
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateUsageOfDiscount(int pId, int uId,int state) throws SQLException;

    /**
     * 更新产品的库存和价格信息
     * @param pId 商品id
     * @param price 价格
     * @param stock 库存
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateProductByPriceAndStock(int pId, BigDecimal price, int stock) throws SQLException;

    /**
     * 更新产品评分
     * @param pid 商品id
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateProductScoreByPid(int pid) throws SQLException;

    /**
     * 查询邀请码的详情 某个用户某个商品的邀请码
     * @param pId 商品id
     * @param uId 用户id
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<UserInvite> selectInviteDetailByPidAndUid(int pId, int uId) throws Exception;

    /**
     * 查询邀请码详情 通过邀请码查询
     * @param inviteCode 邀请码
     * @return 返回查询结果
     * @throws Exception 异常
     */
    List<UserInvite> selectInviteDetailByInviteCode(String inviteCode) throws Exception;

    /**
     * 更新邀请码状态
     * @param codeState 邀请码状态
     * @param inviteCode 邀请码
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateInviteCodeState(int codeState,String inviteCode) throws SQLException;

    /**
     * 插入邀请码详细信息
     * @param pId 商品id
     * @param uId 用户id
     * @param inviteCode 邀请码
     * @param refundCount 退款金额
     * @param codeState 邀请码状态
     * @param beginTime 邀请码生成时间
     * @param endTime 失效时间
     * @return 返回插入结果
     * @throws SQLException 异常
     */
    Integer insertInviteDetail(int pId, Integer uId, String inviteCode, BigDecimal refundCount, int codeState, LocalDateTime beginTime, LocalDateTime endTime) throws SQLException;

    /**
     * 更新邀请码状态 通过商品id和用户id
     * @param pId 商品id
     * @param uId 用户id
     * @param codeState 邀请码状态
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateInviteCodeStateByPidAndUid(int pId, Integer uId, int codeState) throws SQLException;

    /**
     * 更新邀请码信息
     * @param uId 用户id
     * @param codeState 邀请码状态
     * @param inviteCode 邀请码
     * @return 返回更新结果
     * @throws SQLException 异常
     */
    Integer updateInviteDetail(Integer uId, int codeState,String inviteCode) throws SQLException;
}
